<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    


    var arr = [1,4,7,2,5,8,3,6,9];

    // myEach(arr,function(item,index,array){
    //     console.log(item,index,array);
    // })

    // var result = myMap(arr,function(item,index,array){
    //     console.log(item,index,array);
    //     return item + 10;
    // })
    // console.log(result);


    // var result = myFilter(arr,function(item,index,array){
    //     console.log(item,index,array);
    //     return item % 2 == 0;
    // })
    // console.log(result);

    // var result = mySome(arr,function(item,index,array){
    //     console.log(item,index,array);
    //     // return item % 2 == 0;
    //     return item < 0;
    // })
    // console.log(result);


    // var result = myEvery(arr,function(item,index,array){
    //     console.log(item,index,array);
    //     // return item % 2 == 0;
    //     return item > 0;
    // })
    // console.log(result);
    
    var result = myFind(arr,function(item,index,array){
        console.log(item,index,array);
        return item % 2 == 0 && item % 3 == 0 ;
        // return item % 2 == 0 && item % 5 == 0 ;
    })
    console.log(result);
    var result = myFindIndex(arr,function(item,index,array){
        console.log(item,index,array);
        return item % 2 == 0 && item % 3 == 0 ;
        // return item % 2 == 0 && item % 5 == 0 ;
    })
    console.log(result);




    // list => 需要遍历的数组
    // fn   => 回调函数(传入时不执行,每次循环数组时执行  => 提前决定好要执行的内容,调用时执行)
    function myEach(list,fn){
        // var list = [2, 8, 4, 6, 5, 9, 3, 7, 1];

        // function fn(a,b,c){ //形参  a:循环的当前元素  b:循环的当前下标  c:原数组
        //     console.log(a,b,c);
        // }

        // var list = arr;
        // var fn = function(item,index,array){
        //     console.log(item,index,array);
        // }

        for (var i = 0; i < list.length; i++) { // 循环遍历
            var item = list[i]; // 循环的当前元素
            var index = i;      // 循环的当前下标
            var array = list;   // 原数组
            
            if(fn){ // 每次遍历 => 执行函数fn  => 传入实参 循环的当前元素 循环的当前下标 原数组
                fn(item,index,array); //实参
            }
        }
    }

    function myMap(list,fn){
        // var list = [2, 8, 4, 6, 5, 9, 3, 7, 1];

        // function fn(a,b,c){ //形参  a:循环的当前元素  b:循环的当前下标  c:原数组
        //     console.log(a,b,c);
        // }

        // var list = arr;
        // var fn = function(item,index,array){
        //     console.log(item,index,array);
        // }

        var all = [];
        for (var i = 0; i < list.length; i++) { // 循环遍历
            var item = list[i]; // 循环的当前元素
            var index = i;      // 循环的当前下标
            var array = list;   // 原数组
            
            if(fn){ // 每次遍历 => 执行函数fn  => 传入实参 循环的当前元素 循环的当前下标 原数组
                var result = fn(item,index,array); //实参
                all.push(result);
            }
        }
        return all;
    }

    function myFilter(list,fn){
        // var list = [2, 8, 4, 6, 5, 9, 3, 7, 1];

        // function fn(a,b,c){ //形参  a:循环的当前元素  b:循环的当前下标  c:原数组
        //     console.log(a,b,c);
        // }

        // var list = arr;
        // var fn = function(item,index,array){
        //     console.log(item,index,array);
        // }

        var all = [];
        for (var i = 0; i < list.length; i++) { // 循环遍历
            var item = list[i]; // 循环的当前元素
            var index = i;      // 循环的当前下标
            var array = list;   // 原数组
            
            if(fn){ // 每次遍历 => 执行函数fn  => 传入实参 循环的当前元素 循环的当前下标 原数组
                var result = fn(item,index,array); //实参
                if(result){ // 将回调函数的返回值 =>作为if的表达式
                    all.push(item);
                }
            }
        }
        return all;
    }
    
    function mySome(list,fn){
        // var list = [2, 8, 4, 6, 5, 9, 3, 7, 1];

        // function fn(a,b,c){ //形参  a:循环的当前元素  b:循环的当前下标  c:原数组
        //     console.log(a,b,c);
        // }

        // var list = arr;
        // var fn = function(item,index,array){
        //     console.log(item,index,array);
        // }

        var flag = false; // 假设数组中不存在满足条件的元素
        for (var i = 0; i < list.length; i++) { // 循环遍历
            var item = list[i]; // 循环的当前元素
            var index = i;      // 循环的当前下标
            var array = list;   // 原数组
            
            if(fn){ // 每次遍历 => 执行函数fn  => 传入实参 循环的当前元素 循环的当前下标 原数组
                var result = fn(item,index,array); //实参
                if(result){ // 将回调函数的返回值 =>作为if的表达式
                    flag = true;
                    break;
                }
            }
        }
        return flag;
    }

    function myEvery(list,fn){
        // var list = [2, 8, 4, 6, 5, 9, 3, 7, 1];

        // function fn(a,b,c){ //形参  a:循环的当前元素  b:循环的当前下标  c:原数组
        //     console.log(a,b,c);
        // }

        // var list = arr;
        // var fn = function(item,index,array){
        //     console.log(item,index,array);
        // }

        var flag = true; // 假设数组中的元素都满足条件
        for (var i = 0; i < list.length; i++) { // 循环遍历
            var item = list[i]; // 循环的当前元素
            var index = i;      // 循环的当前下标
            var array = list;   // 原数组
            
            if(fn){ // 每次遍历 => 执行函数fn  => 传入实参 循环的当前元素 循环的当前下标 原数组
                var result = fn(item,index,array); //实参
                // Boolean(result) == false
                // !!result == false
                if(!result){ // !result = true   result => 转化为布尔值为false
                    flag = false;
                    break;
                }
            }
        }
        return flag;
    }


    function myFind(list,fn){
        // var list = [2, 8, 4, 6, 5, 9, 3, 7, 1];

        // function fn(a,b,c){ //形参  a:循环的当前元素  b:循环的当前下标  c:原数组
        //     console.log(a,b,c);
        // }

        // var list = arr;
        // var fn = function(item,index,array){
        //     console.log(item,index,array);
        // }

        for (var i = 0; i < list.length; i++) { // 循环遍历
            var item = list[i]; // 循环的当前元素
            var index = i;      // 循环的当前下标
            var array = list;   // 原数组
            
            if(fn){ // 每次遍历 => 执行函数fn  => 传入实参 循环的当前元素 循环的当前下标 原数组
                var result = fn(item,index,array); //实参
                if(result){ // 将回调函数的返回值 =>作为if的表达式
                    return item;
                }
            }
        }
    }

    function myFindIndex(list,fn){
        // var list = [2, 8, 4, 6, 5, 9, 3, 7, 1];

        // function fn(a,b,c){ //形参  a:循环的当前元素  b:循环的当前下标  c:原数组
        //     console.log(a,b,c);
        // }

        // var list = arr;
        // var fn = function(item,index,array){
        //     console.log(item,index,array);
        // }
        for (var i = 0; i < list.length; i++) { // 循环遍历
            var item = list[i]; // 循环的当前元素
            var index = i;      // 循环的当前下标
            var array = list;   // 原数组
            
            if(fn){ // 每次遍历 => 执行函数fn  => 传入实参 循环的当前元素 循环的当前下标 原数组
                var result = fn(item,index,array); //实参
                if(result){ // 将回调函数的返回值 =>作为if的表达式
                    return index;
                }
            }
        }
        return -1;
    }




    // if(" "){ // "" 0 NaN  null undefined
    //     console.log(1111)
    // }else{
    //     console.log(2222);
    // }


</script>
</html>